/**
*****************************************************************************************
*     Copyright(c) 2017, Realtek Semiconductor Corporation. All rights reserved.
*****************************************************************************************
  * @file     lls.h
  * @brief    Head file for using link loss service.
  * @details  LLS data structs and external functions declaration.
  * @author
  * @date
  * @version  v1.0
  * *************************************************************************************
  */

/* Define to prevent recursive inclusion */
#ifndef _LLS_H_
#define _LLS_H_

#ifdef  __cplusplus
extern "C" {
#endif      /* __cplusplus */

/* Add Includes here */
#include "profile_server.h"

/** @defgroup LLS Link Loss Service
  * @brief Link loss service
  * @details

    The Link Loss Service (LLS) defines behavior when a link is lost between two devices.

    The Link Loss Service uses the Alert Level characteristic to cause an alert in the device
    when the link is lost.

    Link Loss Service generally constitutes a profile collectively with other Services, such
    as Proximity or Find Me etc., which enables device to cause an alert when the link is lost.

    Application shall register link loss service when initialization through @ref lls_add_service function.

    Application can set LLS alert level value through @ref lls_set_parameter function.

  * @{
  */
/*============================================================================*
 *                              Macros
 *============================================================================*/
/** @defgroup LLS_Exported_Macros LLS Service Exported Macros
  * @brief
  * @{
  */

/** @defgroup LLS_Read_Info LLS Read Info
  * @brief  Read characteristic value.
  * @{
  */
#define LLS_READ_ALERT_LEVEL 1
/** @} */

/** @} End of LLS_Exported_Macros */

/*============================================================================*
 *                              Types
 *============================================================================*/

/** @defgroup LLS_Exported_Types LLS Exported Types
  * @brief
  * @{
  */

/** @defgroup LLS_PARAM_TYPE LLS Parameter Type
* @brief Type of parameters set from application.
* @{
*/
typedef enum
{
    LLS_PARAM_LINK_LOSS_ALERT_LEVEL
} T_LLS_PARAM_TYPE;
/** @} */

/** @defgroup LLS_Callback_Data LLS Callback Data
  * @brief LLS data struct for notification data to application.
  * @{
  */
/** Message content: @ref T_LLS_CALLBACK_DATA */
typedef union
{
    uint8_t read_value_index;
    uint8_t write_alert_level;
} T_LLS_UPSTREAM_MSG_DATA;

/** LLSdata service data to inform application */
typedef struct
{
    uint8_t                 conn_id;
    T_SERVICE_CALLBACK_TYPE msg_type;
    T_LLS_UPSTREAM_MSG_DATA msg_data;
} T_LLS_CALLBACK_DATA;
/** @} */

/** @} End of LLS_Exported_Types */

/*============================================================================*
 *                              Functions
 *============================================================================*/

/** @defgroup LLS_Exported_Functions LLS Exported Functions
  * @brief
  * @{
  */

/**
 * @brief       Set a link loss service parameter.
 *
 *              NOTE: You can call this function with a link loss service parameter type and it will set the
 *                      link loss service parameter. Link loss service parameters are defined in @ref T_LLS_PARAM_TYPE.
 *                      If the "len" field sets to the size of a "uint16_t" ,the
 *                      "p_value" field must point to a data with type of "uint16_t".
 *
 * @param[in]   param_type   Link loss service parameter type: @ref T_LLS_PARAM_TYPE
 * @param[in]   length       Length of data to write
 * @param[in]   p_value Pointer to data to write.  This is dependent on
 *                      the parameter type and WILL be cast to the appropriate
 *                      data type (For example: if data type of param is uint16_t, p_value will be cast to
 *                      pointer of uint16_t).
 *
 * @return Operation result.
 * @retval true Operation success.
 * @retval false Operation failure.
 */
bool lls_set_parameter(T_LLS_PARAM_TYPE param_type, uint8_t length, void *p_value);

/**
  * @brief Add link loss service to the BLE stack database.
  *
  * @param[in]   p_func  Callback when service attribute was read, write or cccd update.
  * @return Service id generated by the BLE stack: @ref T_SERVER_ID.
  * @retval 0xFF Operation failure.
  * @retval others Service id assigned by stack.
  *
  * <b>Example usage</b>
  * \code{.c}
    void profile_init()
    {
        server_init(1);
        lls_id = lls_add_service(app_handle_profile_message);
    }
  * \endcode
  */
T_SERVER_ID lls_add_service(void *p_func);
/** @} End of LLS_Exported_Functions */

/** @} End of LLS*/


#ifdef  __cplusplus
}
#endif      /*  __cplusplus */

#endif

